// 给定一颗二叉树，请设计算法按层序分组得到遍历结果。

interface TreeNode {
    val: number;
    left: TreeNode | null;
    right: TreeNode | null;
}

var levelOrder: (root: TreeNode) => number[][] = function (root) {
    // 边缘情况
    if (!root) {
        return [];
    }
    // 声明队列、结果数组
    const queue: TreeNode[] = [root];
    const res: number[][] = [];
    // 基于队列进行层序遍历
    while (queue.length > 0) {
        // 声明记录当前层数，当前层数组
        const layerNum: number = queue.length;
        const currLayer: number[] = [];
        // 基于当前层个数记录进行循环
        for (let i: number = 0; i < layerNum; i++) {
            // 当前节点出队，子节点加入队列
            let curr = <TreeNode>queue.shift();
            if (curr.left !== null) {
                queue.push(curr.left);
            }
            if (curr.right !== null) {
                queue.push(curr.right)
            }
            currLayer.push(<number>curr.val);
        }
        // 内层循环的结果加入队列
        res.push(currLayer);
    }
    return res;
};

        // 这道题难度就比较小了，个人认为属于模板类的套路题。
        // 看到层序遍历就很自然的想到队列结构的使用
        // 而这道题和一般层序遍历唯一的区别就是要求按照每层进行一个数组分组
        // 而这个处理方式也很容易想到，我们在进入每层的循环前
        // 先用一个临时变量 layerNum 记录队列内的当前长度
        // 然后补一个内层基于layerNum的for循环，将for循环遍历的结果加入一个当前层数组
        // 出循环后将当前层数组加入结果数组中即可